package model

/*
p类目表
id	类目名称	父id	品牌
1	男鞋		0		1


p类目属性属性表	(类目表[1] -> 类目属性属性表[多])
id	类目id	属性名		属性code
1	1		颜色			color_name
2	1		尺寸			size


p品牌表	(类目表[多] -> 品牌表[多])
id	品牌名称	类目
1	耐克		1


s商品头表 goods_hdt	（商品头表[1] -> 类目表[1]，商品头表[1] -> 品牌表[1]）
id	商品名称 					类目			品牌		是否包邮		是否热卖 	 	搜藏数	点击数	单位		包装单位	前端展示图		详情图list
1	怎么穿都不臭脚的运动鞋		1			1		是			是			10		100		双		箱		http//:a.png	[1.png,2.png]

s商品类目属性属性值表	（商品头表[1] ->	商品类目属性属性值表[多]）
id	商品id	类目属性id	属性值		属性图片(非必填)
1	1		1			白色			http//:a.png
2	1		1			黑色			http//:a.png
3	1		1			红色			http//:a.png
4	1		2			41
5	1		2			42
6	1		2			43
7	1		2			44

s商品类目属性详情表 goods_dtl	(商品头表[1] ->	商品类目属性详情表[多])
id	商品id	商品类目属性属性值集合		价格				优惠价格
1	1		1-4						110				110*0.8		怎么穿都不臭脚的运动鞋		颜色：白色-尺寸：41	110元	优惠88
2	1		1-5						120				120*0.8
3	1		1-6						130				130*0.8
4	1		1-7						140				140*0.8

5	1		2-4						150				150*0.8
6	1		2-5						160				160*0.8
7	1		2-6						170				170*0.8
8	1		2-7						180				180*0.8

9	1		3-4						190				190*0.8
10	1		3-5						200				200*0.8
11	1		3-6						300				300*0.8
12	1		3-7						400				400*0.8


s商品类目属性库存表 stock （goods_dtl[1] -> stock[多]）
id	商品类目详情表id	库存		仓库id		库位id
1	1				100		1			1
2	2				100		1			2
3	3				100		1			3
4	14				100		1			4

5	5				100		1			5
6	6				100		1			6
7	7				100		1			7
8	8				100		1			8

9	9				100		1			9
10	10				100		1			10
11	11				100		1			11
12	12				100		1			12
13	12				200		2			13		// 模拟商品在另一个仓库也有
*/

// Stock 库存表
type Stock struct {
	Id         uint64 `gorm:"type:bigint unsigned;primary_key;comment:主键"`
	GoodsDtlId uint64 `gorm:"column:goods_dtl_id;type:bigint unsigned;index:idx_goods_dtl_id;not null;comment:商品明细id"`
	StoreId    uint64 `gorm:"column:store_id;type:bigint unsigned;not null;comment:仓库id"`
	LocationId uint64 `gorm:"column:location_id;type:bigint unsigned;not null;comment:库位id"`
	Qty        uint64 `gorm:"column:qty;type:bigint unsigned;not null;comment:库存数量"`
	Version    uint64 `gorm:"column:version;type:bigint unsigned;not null;comment:实现乐观锁的版本号"`
}

/*
GoodsDtlId 这里为什么不加唯一索引，因为一个商品类目详情可能在多个仓库，或多个库位都有库存，因此不能设置唯一索引。

mysql for update 锁行的索引必须是唯一索引吗？
	在MySQL中，使用`FOR UPDATE`语句来锁定行的索引并不一定需要是唯一索引，但唯一索引通常更适合用于此目的。当你使用`FOR UPDATE`时，它会锁定满足查询条件的行，以确保其他事务不能同时修改这些行。这种锁定通常用于处理事务中的并发性问题，例如避免多个事务同时更新相同的数据。
唯一索引之所以更适合用于这种情况，是因为它们可以更精确地锁定单个行。如果你的查询条件可以唯一地标识一行，那么使用唯一索引会更有效。但如果你的查询条件不足以唯一标识一行，MySQL 仍然会尝试使用其他索引或表扫描来锁定匹配的行。
使用非唯一索引或没有索引的情况下，`FOR UPDATE`可能会锁定更多的行，因为它将锁定所有满足查询条件的行，而不仅仅是唯一匹配的行。这可能会导致更大的锁冲突和性能问题。
总之，虽然`FOR UPDATE`不要求唯一索引，但在大多数情况下，唯一索引更适合用于确保锁定行的准确性。你应该根据你的数据和业务需求来选择合适的索引策略。

结论：在更新库存加锁的场景下，最好都使用 id(唯一索引) 来查询某一行，进行加锁。上面的例子中 GoodsDtlId 并不少唯一索引。
*/
